home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / pilot-clip.c < prev    next >
C/C++ Source or Header  |  1997-06-13  |  3KB  |  158 lines

  1. /* pilot-clip.c:  Transfer data to or from the Pilot's clipboard
  2.  *
  3.  * This is free software, licensed under the GNU Public License V2.
  4.  * See the file COPYING for details.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "pi-source.h"
  10. #include "pi-socket.h"
  11. #include "pi-syspkt.h"
  12. #include "pi-dlp.h"
  13.  
  14. void * GetClip(int socket, int type, int * length)
  15. {
  16.   struct RPC_params p;
  17.   int l, err;
  18.   unsigned long handle, ptr;
  19.   void * buffer;
  20.   
  21.   /* ClipboardGetItem */
  22.   PackRPC(&p, 0xA10C, RPC_PtrReply, RPC_Byte(type), RPC_ShortPtr(&l), RPC_End);
  23.   err = dlp_RPC(socket, &p, &handle);
  24.   if (err)
  25.     return 0;
  26.       
  27.   if (!handle)
  28.     return 0;
  29.       
  30.   /* MemHandleLock */
  31.   PackRPC(&p, 0xA021, RPC_PtrReply, RPC_Long(handle), RPC_End);
  32.   err = dlp_RPC(socket, &p, &ptr);
  33.   
  34.   if (err)
  35.     return 0;
  36.  
  37.   buffer = malloc(l);
  38.   
  39.   /* MemMove */
  40.   PackRPC(&p, 0xA026, RPC_IntReply, RPC_Ptr(buffer, l), RPC_Long(ptr), RPC_Long(l), RPC_End);
  41.   err = dlp_RPC(socket, &p, 0);
  42.  
  43.   /* MemHandleUnlock */
  44.   PackRPC(&p, 0xA022, RPC_IntReply, RPC_Long(handle), RPC_End);
  45.   err = dlp_RPC(socket, &p, 0);
  46.  
  47.   if (length)
  48.     *length = l;
  49.     
  50.   return buffer;
  51. }
  52.  
  53. int SetClip(int socket, int type, void * data, int length)
  54. {
  55.   struct RPC_params p;
  56.   int err;
  57.   char * b = data;
  58.   unsigned long handle, ptr;
  59.  
  60.  
  61.   /* MemHandleNew */
  62.   PackRPC(&p, 0xA01E, RPC_PtrReply, RPC_Long(length), RPC_End);
  63.   err = dlp_RPC(socket, &p, &handle);
  64.   if (err)
  65.     return 0;
  66.       
  67.   if (!handle)
  68.     return 0;
  69.       
  70.   /* MemHandleLock */
  71.   PackRPC(&p, 0xA021, RPC_PtrReply, RPC_Long(handle), RPC_End);
  72.   err = dlp_RPC(socket, &p, &ptr);
  73.   
  74.   if (err)
  75.     return 0;
  76.  
  77.   /* MemMove */
  78.   PackRPC(&p, 0xA026, RPC_IntReply, RPC_Long(ptr), RPC_Ptr(b, length), RPC_Long(length), RPC_End);
  79.   err = dlp_RPC(socket, &p, 0);
  80.  
  81.   length--;
  82.   
  83.   /* ClipboardAddItem */
  84.   PackRPC(&p, 0xA10A, RPC_IntReply, RPC_Byte(type), RPC_Long(ptr), RPC_Short(length), RPC_End);
  85.   err = dlp_RPC(socket, &p, 0);
  86.  
  87.   /* MemPtrFree */
  88.   PackRPC(&p, 0xA012, RPC_IntReply, RPC_Long(ptr), RPC_End);
  89.   err = dlp_RPC(socket, &p, 0);
  90.   return 1;
  91. }
  92.  
  93.  
  94. int main(int argc, char *argv[])
  95. {
  96.   struct pi_sockaddr addr;
  97.   int sd;
  98.   int ret;
  99.   char buffer[0xffff];
  100.  
  101.   if (argc < 3) {
  102.     fprintf(stderr,"usage:%s %s -s|-g\n",argv[0],TTYPrompt);
  103.     exit(2);
  104.   }
  105.   
  106.   if (strcmp(argv[2],"-s") && strcmp(argv[2],"-g")) {
  107.     fprintf(stderr,"usage:%s %s -s|-g\n",argv[0],TTYPrompt);
  108.     exit(2);
  109.   }
  110.   
  111.   if (!(sd = pi_socket(PI_AF_SLP, PI_SOCK_STREAM, PI_PF_PADP))) {
  112.     perror("pi_socket");
  113.     exit(1);
  114.   }
  115.     
  116.   addr.pi_family = PI_AF_SLP;
  117.   strcpy(addr.pi_device,argv[1]);
  118.   
  119.   ret = pi_bind(sd, (struct sockaddr*)&addr, sizeof(addr));
  120.   if(ret == -1) {
  121.     perror("pi_bind");
  122.     exit(1);
  123.   }
  124.  
  125.   ret = pi_listen(sd, 1);
  126.   if(ret == -1) {
  127.     perror("pi_listen");
  128.     exit(1);
  129.   }
  130.  
  131.   sd = pi_accept(sd, 0, 0);
  132.   if(sd < 0) {
  133.     perror("pi_accept");
  134.     exit(1);
  135.   }
  136.   
  137.   /* Tell user (via Pilot) that we are starting things up */
  138.   dlp_OpenConduit(sd);
  139.   
  140.   if (strcmp(argv[2], "-s")==0) {
  141.     ret = read(fileno(stdin), buffer, 0xffff);
  142.     dumpdata(buffer, ret);
  143.     if (ret>=0) {
  144.       buffer[ret++] = 0;
  145.       SetClip(sd, 0, buffer, ret);
  146.     }
  147.   } else {
  148.     char * b;
  149.     ret = 0;
  150.     b = GetClip(sd, 0, &ret);
  151.     if (ret>0)
  152.       write(fileno(stdout), b, ret);
  153.   }
  154.   
  155.   pi_close(sd);
  156.   exit(0);
  157. }
  158.